(function() {
  // don't emit events from inside the previews themselves
  if ( window.location.search.match( /receiver/gi ) ) { return; }

  var socket = io.connect(window.location.origin + "/notes");
  var socketId = Math.random().toString().slice(2,6);

  console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
  // window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);

  // Fires when a fragment is shown
  Reveal.addEventListener( 'fragmentshown', function( event ) {
    var fragmentData = {
      fragment : 'next',
      socketId : socketId
    };
    socket.emit('fragmentchanged', fragmentData);
  } );

  // Fires when a fragment is hidden
  Reveal.addEventListener( 'fragmenthidden', function( event ) {
    var fragmentData = {
      fragment : 'previous',
      socketId : socketId
    };
    socket.emit('fragmentchanged', fragmentData);
  } );

  // Fires when slide is changed
  Reveal.addEventListener( 'slidechanged', function( event ) {
    var nextindexh;
    var nextindexv;
    var slideElement = event.currentSlide;

    if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
      nextindexh = event.indexh;
      nextindexv = event.indexv + 1;
    } else {
      nextindexh = event.indexh + 1;
      nextindexv = 0;
    }

    var notes = slideElement.querySelector('aside.notes');
    var slideData = {
      notes : notes ? notes.innerHTML : '',
      indexh : event.indexh,
      indexv : event.indexv,
      nextindexh : nextindexh,
      nextindexv : nextindexv,
      socketId : socketId,
      markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false

    };

    socket.emit('slidechanged', slideData);
  } );
}());
